#include <iostream>
#include <cstdio>
#include <cassert>
#include <unistd.h>
#include <string>
#include <cstring>
#include <cerrno>
#include <pthread.h>

using namespace std;
//线程简单实用
// int x=100;
// void show(const string &name)
// {
//     cout << name << ", pid: " << getpid() << " " << x << "\n"
//          <<  endl;
//          x--;
// }
// void* threadRun(void* args)
// {
//     //新线程
//     const string name = (char *)args;
//     //int i=10;
//     while (true)
//     {
//         show(name);
//         //cout<<i<<endl;
//         //i--;
//         break;
//         sleep(1);
//     }
//     //pthread_exit();
//     return nullptr;
// }
// int main()
// {
//     pthread_t tid;//创建线程id
//     void *ret;
//     int n=pthread_create(&tid,nullptr,threadRun,(void*)"thread run"); //创建线程，设置线程属性，回调函数，传参
//     assert(n==0);
//     //cout<<pthread_self();//获取线程ID
//     cout<<pthread_join(tid,&ret);//线程等待

//     while (true)
//     {
//         cout << "main thread, pid: " << getpid() << endl;//主线程
//         sleep(3);
//     }
//     return 0;
// }
__thread int g_val=100; //__thread修饰全局变量，使每一个线程都有一个全局的变量，局部存储
void* threadRoutine(void* args)
{
// // 1. 线程谁先运行与调度器相关
// // 2. 线程一旦异常，都可能导致整个进程整体退出
// // 3. 线程的输入和返回值问题
// // 4. 线程异常退出的理解
    while(true)
    {
        cout << (char*)args << " : " << g_val << " &: " << &g_val << endl;
        //cout<<"thread getpid:"<<getpid()<<endl;
        g_val++;
        sleep(1);
        // int a = 10;
        // a /= 0;
        break;
    }

    pthread_exit((void*)11);
   // pthread_cancel(pthread_self()); // 不推荐
    int i = 0;
    // int *data = new int[10];
    while (true)
    {
        cout << "新线程： " << (char *)args << " running ..." << pthread_self() << endl;
        sleep(1);
        // data[i] = i;
        // if(i++ == 3) break;
        // int a  = 100;
        // a /= 0;
    }
   // pthread_exit((void*)13);
    //exit(10); // 不要调用exit，exit是终止进程的！
    cout << "new thread quit ..." << endl;
    //return (void*)data;
    return (void *)10; // 是返回给谁呢？一般是给main thread, main如何获取到呢？pthread_join
}
int main()
{
    // 因为我们目前用的不是Linux自带的创建线程的接口，我们用的是pthread库中的接口！
    pthread_t tid; // 本质是一个地址！
    //cout<<pthread_self();
    pthread_create(&tid,nullptr,threadRoutine,(void*)"thread one");
    while(true)
    {
        cout<<"main getpid:"<<getpid()<<endl;
        sleep(1);
        break;
    }
    int n=pthread_join(tid,nullptr);
    //cout << "n :" << n << "errstring: " << strerror(n) << endl;//浮点数错误

    printf("%lu,%p\n",tid,tid);
    int count=0;
    while(true)
    {
        cout<<"main thread run int ... main tid:"<<pthread_self()<<endl;
        sleep(1);
        count++;
        if(count==5) break;
    }


    // pthread_cancel(tid);
    // cout << "pthread cancel: " << tid << endl;

    // int *ret = nullptr;
    // pthread_join(tid, (void **)&ret); // 默认会阻塞等待新线程退出

    //1. 线程被取消，join的时候，退出码是-1 #define PTHREAD_CANCELED ((void *) -1)
    // PTHREAD_CANCELED;
    // cout << "main thread wait done ... main quit ...: new thead quit : " << (long long)ret << "\n";
    // //sleep(5);
    // for(int i=0;i<10;i++)
    // {
    //     cout<<ret[i]<<endl;
    // }
    // while(true)
    // {
    //     cout <<"main线程： " << " running ..." << endl;
    //     sleep(1);
    // }
    return 0;
}